What is it?
This data can be downloaded from: https://www.kaggle.com/NUFORC/ufo-sightings It contains two files. There are two versions of this dataset: scrubbed and complete. The complete data includes entries where the location of the sighting was not found or blank (0.8146%) or have an erroneous or blank time (8.0237%). Since the reports date back to the 20th century, some older data might be obscured. Data contains city, state, time, description, and duration of each sighting.
What we are going to do?
We are going to plot some charts to better visualize the data we got.
In this post, however we shall be looking at one variable independent with others.
House keeping stuff
- Load library gglot , plyr and rworldmap in your R environment. If you have not installed the library you will first need to install it.
- Download and save the data to your machine
Now lets look at the data and see what we got. For simplicity lets display only first three rows.
head(ufo_data, n = 3)
Types of Variables
1. Quantitative variable
Those variables which can be counted or measured. Such variables fall into two categories. Discrete are those which you can count, while continuous are those which you can measure.
2. Qualitative variable
Variables which are in textual form. Nominal are those which are not measurable or do not show the relationship with each other such as gender, while those which show relationship are called ordinal such as basic / extreme, or high and higher.
Knowing the type of variable is important because it allows to make appropriate graphs and hence visualize the information.
We shall be looking at country , shape , duration , longitude and latitude columns. In the next post, we shall look at date and time variables.
Before we move forward we shall need to see how our data is stored in data frame.
print(is.factor(ufo_data$country))
[1] TRUE
print(is.factor(ufo_data$shape))
[1] TRUE
print(is.factor(ufo_data$duration))
[1] FALSE
print(is.factor(ufo_data$longitude))
[1] FALSE
print(is.factor(ufo_data$latitude))
[1] TRUE
We can see that “country”, “shape” and “latitude” are factors. So lets convert them into primitive data types
ufo_data$shape = as.character(ufo_data$shape)
ufo_data$country = as.character(ufo_data$country)
ufo_data$latitude = as.numeric(ufo_data$latitude)
Looking at Longitude / Latitude column
Lets plot the longitude and latitude to see where our UFOs are being sighted.
map <- getMap()
plot(map) + points(ufo_data$longitude, ufo_data$latitude, pch=19, col="blue", cex=.3)
integer(0)

NA
Now through this plot, we can see where ufo sightings have been recorded. We shall see more about ploting spatial plots in some other post.
Analyzing shape column
First lets see what unique shapes we have got. We can see that an empty item is present. So we replace it with not specified.
unique(x = ufo_data$shape)
[1] "cylinder" "light" "circle" "sphere" "disk" "fireball" "unknown"
[8] "oval" "other" "cigar" "rectangle" "chevron" "triangle" "formation"
[15] "" "delta" "changing" "egg" "diamond" "flash" "teardrop"
[22] "cone" "cross" "pyramid" "round" "crescent" "flare" "hexagon"
[29] "dome" "changed"
ufo_data$shape[ufo_data$shape == ""] <- 'Not specified'
shape_data <- data.frame( count(df = ufo_data, vars = "shape"))
ggplot(data = shape_data, aes(x=shape, y=freq)) +
ggtitle("Looking at Shape") +
xlab("Shape") +
ylab("Count") +
geom_bar(fill="steelblue",stat="identity" ) +
theme(axis.text.x = element_text(angle = 90, hjust = 1))

So through this plot, we can see that unkown and not specified actually add upto significant number. If we were performing any regression analysis, we would surely club these together into single variable. Similary crescent , pyramid and round could be dealt this way as well.
Analyzing country column
Lets look at what countries we got in our dataset.
unique(ufo_data$country)
[1] "us" "" "gb" "ca" "au" "de"
Hmmm… Does not make sense. Since we dont want to use short forms for countries, lets encode them to what they actually may be.
ufo_data$extendedCountry[ufo_data$country == "us"] <- 'USA'
ufo_data$extendedCountry[ufo_data$country == "gb"] <- 'United Kingdom'
ufo_data$extendedCountry[ufo_data$country == "ca"] <- 'Canada'
ufo_data$extendedCountry[ufo_data$country == "au"] <- 'Australia'
ufo_data$extendedCountry[ufo_data$country == "de"] <- 'Germany'
ufo_data$extendedCountry[ufo_data$country == ""] <- 'Unknown'
Once done, lets look at the counts for each of the country.
country_count = count(df = ufo_data, vars = "extendedCountry")
print(country_count)
No idea, why UFOs are most sighted in USA … But so many unknown locations are present. The number is high so any statistical analysis cant be performed without ignoring or catering for these locations.
Since we have spatial data we can very effectively display it on map. Although there are many other ways to visualize the information such as pie charts or donut charts, but display on map is probably the most interactive way.
pie_chart_data = data.frame(group = country_count$extendedCountry, value = country_count$freq)
matched <- joinCountryData2Map(pie_chart_data, joinCode="NAME", nameJoinColumn="group")
5 codes from your data successfully matched countries in the map
1 codes from your data failed to match with a country code in the map
238 codes from the map weren't represented in your data
mapCountryData(matched, nameColumnToPlot="value", mapTitle="UFO Sightings in the World", catMethod = "quantiles", colourPalette = "topo", oceanCol="aliceblue")

Now suppose if we wanted to zoom into map for some particular region we would use the following code:
mapCountryData(matched, nameColumnToPlot="value", mapTitle="UFO Sightings in the World", catMethod = "quantiles", colourPalette = "topo", oceanCol="aliceblue", mapRegion = "Australia")

Conclusion
In this post we saw how we can look at the data for pre analysis and modify it as per our requirements. We also saw how we can plot graphs for only one variable and perform simple aggregations.
LS0tDQp0aXRsZTogIlBsb3R0aW5nIFVGTyBTaWdodGluZ3MgZGF0YSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIyBXaGF0IGlzIGl0PyANClRoaXMgZGF0YSBjYW4gYmUgZG93bmxvYWRlZCBmcm9tOiBodHRwczovL3d3dy5rYWdnbGUuY29tL05VRk9SQy91Zm8tc2lnaHRpbmdzDQpJdCBjb250YWlucyB0d28gZmlsZXMuIFRoZXJlIGFyZSB0d28gdmVyc2lvbnMgb2YgdGhpcyBkYXRhc2V0OiBzY3J1YmJlZCBhbmQgY29tcGxldGUuIFRoZSBjb21wbGV0ZSBkYXRhIGluY2x1ZGVzIGVudHJpZXMgd2hlcmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBzaWdodGluZyB3YXMgbm90IGZvdW5kIG9yIGJsYW5rICgwLjgxNDYlKSBvciBoYXZlIGFuIGVycm9uZW91cyBvciBibGFuayB0aW1lICg4LjAyMzclKS4gU2luY2UgdGhlIHJlcG9ydHMgZGF0ZSBiYWNrIHRvIHRoZSAyMHRoIGNlbnR1cnksIHNvbWUgb2xkZXIgZGF0YSBtaWdodCBiZSBvYnNjdXJlZC4gRGF0YSBjb250YWlucyBjaXR5LCBzdGF0ZSwgdGltZSwgZGVzY3JpcHRpb24sIGFuZCBkdXJhdGlvbiBvZiBlYWNoIHNpZ2h0aW5nLg0KDQojIyMgV2hhdCB3ZSBhcmUgZ29pbmcgdG8gZG8/DQpXZSBhcmUgZ29pbmcgdG8gcGxvdCBzb21lIGNoYXJ0cyB0byBiZXR0ZXIgdmlzdWFsaXplIHRoZSBkYXRhIHdlIGdvdC4gDQoNCkluIHRoaXMgcG9zdCwgaG93ZXZlciB3ZSBzaGFsbCBiZSBsb29raW5nIGF0IG9uZSB2YXJpYWJsZSBpbmRlcGVuZGVudCB3aXRoIG90aGVycy4NCg0KIyMjIEhvdXNlIGtlZXBpbmcgc3R1ZmYNCiAgMS4gTG9hZCBsaWJyYXJ5IDxiPiBnZ2xvdCA8L2I+LCA8Yj4gcGx5ciA8L2I+IGFuZCA8Yj4gcndvcmxkbWFwIDwvYj4gaW4geW91ciBSIGVudmlyb25tZW50Lg0KICAgICBJZiB5b3UgaGF2ZSBub3QgaW5zdGFsbGVkIHRoZSBsaWJyYXJ5IHlvdSB3aWxsIGZpcnN0IG5lZWQgdG8gaW5zdGFsbCBpdC4NCiAgMi4gRG93bmxvYWQgYW5kIHNhdmUgdGhlIGRhdGEgdG8geW91ciBtYWNoaW5lDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGx5cikNCmxpYnJhcnkocndvcmxkbWFwKQ0KDQp1Zm9fZGF0YSA8LSByZWFkLmNzdignQzpcXFVzZXJzXFxVbWFpciBLaGFuXFxEZXNrdG9wXFxEYXRhc2NpZW5jZSBQb3J0Zm9saW9cXHVmby1zaWdodGluZ3NcXHNjcnViYmVkLmNzdicpDQoNCmBgYA0KDQpOb3cgbGV0cyBsb29rIGF0IHRoZSBkYXRhIGFuZCBzZWUgd2hhdCB3ZSBnb3QuIEZvciBzaW1wbGljaXR5IGxldHMgZGlzcGxheSBvbmx5IGZpcnN0IHRocmVlIHJvd3MuDQoNCmBgYHtyIGVjaG89VFJVRX0NCmhlYWQodWZvX2RhdGEsIG4gPSAzKQ0KYGBgDQoNCiMjIyBUeXBlcyBvZiBWYXJpYWJsZXMNCg0KIyMjIyAxLiBRdWFudGl0YXRpdmUgdmFyaWFibGUNCiAgDQogIFRob3NlIHZhcmlhYmxlcyB3aGljaCBjYW4gYmUgY291bnRlZCBvciBtZWFzdXJlZC4gU3VjaCB2YXJpYWJsZXMgZmFsbCBpbnRvIHR3byBjYXRlZ29yaWVzLiAgICAgICBEaXNjcmV0ZSBhcmUgdGhvc2Ugd2hpY2ggeW91IGNhbiBjb3VudCwgd2hpbGUgY29udGludW91cyBhcmUgdGhvc2Ugd2hpY2ggeW91IGNhbiBtZWFzdXJlLg0KICANCiMjIyMgMi4gUXVhbGl0YXRpdmUgdmFyaWFibGUNCiAgDQogIFZhcmlhYmxlcyB3aGljaCBhcmUgaW4gdGV4dHVhbCBmb3JtLiBOb21pbmFsIGFyZSB0aG9zZSB3aGljaCBhcmUgbm90IG1lYXN1cmFibGUgb3IgZG8gbm90IHNob3cgICB0aGUgcmVsYXRpb25zaGlwIHdpdGggZWFjaCBvdGhlciBzdWNoIGFzIGdlbmRlciwgd2hpbGUgdGhvc2Ugd2hpY2ggc2hvdyByZWxhdGlvbnNoaXAgYXJlIGNhbGxlZCAgIG9yZGluYWwgc3VjaCBhcyBiYXNpYyAvIGV4dHJlbWUsIG9yIGhpZ2ggYW5kIGhpZ2hlci4NCg0KS25vd2luZyB0aGUgdHlwZSBvZiB2YXJpYWJsZSBpcyBpbXBvcnRhbnQgYmVjYXVzZSBpdCBhbGxvd3MgdG8gbWFrZSBhcHByb3ByaWF0ZSBncmFwaHMgYW5kIGhlbmNlIHZpc3VhbGl6ZSB0aGUgaW5mb3JtYXRpb24uDQoNCldlIHNoYWxsIGJlIGxvb2tpbmcgYXQgPGI+IGNvdW50cnkgPC9iPiwgPGI+IHNoYXBlIDwvYj4sIDxiPmR1cmF0aW9uIDwvYj4sIDxiPiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIDwvYj4gY29sdW1ucy4NCkluIHRoZSBuZXh0IHBvc3QsIHdlIHNoYWxsIGxvb2sgYXQgZGF0ZSBhbmQgdGltZSB2YXJpYWJsZXMuDQoNCkJlZm9yZSB3ZSBtb3ZlIGZvcndhcmQgd2Ugc2hhbGwgbmVlZCB0byBzZWUgaG93IG91ciBkYXRhIGlzIHN0b3JlZCBpbiBkYXRhIGZyYW1lLiANCg0KDQpgYGB7cn0NCnByaW50KGlzLmZhY3Rvcih1Zm9fZGF0YSRjb3VudHJ5KSkNCnByaW50KGlzLmZhY3Rvcih1Zm9fZGF0YSRzaGFwZSkpDQpwcmludChpcy5mYWN0b3IodWZvX2RhdGEkZHVyYXRpb24pKQ0KcHJpbnQoaXMuZmFjdG9yKHVmb19kYXRhJGxvbmdpdHVkZSkpDQpwcmludChpcy5mYWN0b3IodWZvX2RhdGEkbGF0aXR1ZGUpKQ0KYGBgDQoNCldlIGNhbiBzZWUgdGhhdCAiY291bnRyeSIsICJzaGFwZSIgYW5kICJsYXRpdHVkZSIgYXJlIGZhY3RvcnMuIFNvIGxldHMgY29udmVydCB0aGVtIGludG8gcHJpbWl0aXZlIGRhdGEgdHlwZXMNCg0KDQpgYGB7cn0NCnVmb19kYXRhJHNoYXBlID0gYXMuY2hhcmFjdGVyKHVmb19kYXRhJHNoYXBlKQ0KdWZvX2RhdGEkY291bnRyeSA9IGFzLmNoYXJhY3Rlcih1Zm9fZGF0YSRjb3VudHJ5KQ0KdWZvX2RhdGEkbGF0aXR1ZGUgPSBhcy5udW1lcmljKHVmb19kYXRhJGxhdGl0dWRlKQ0KYGBgDQoNCiMjIyBMb29raW5nIGF0IExvbmdpdHVkZSAvIExhdGl0dWRlIGNvbHVtbg0KDQpMZXRzIHBsb3QgdGhlIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgdG8gc2VlIHdoZXJlIG91ciBVRk9zIGFyZSBiZWluZyBzaWdodGVkLg0KDQpgYGB7ciBlY2hvPVRSVUV9DQptYXAgPC0gZ2V0TWFwKCkNCnBsb3QobWFwKSArIHBvaW50cyh1Zm9fZGF0YSRsb25naXR1ZGUsIHVmb19kYXRhJGxhdGl0dWRlLCBwY2g9MTksIGNvbD0iYmx1ZSIsIGNleD0uMykNCiANCmBgYA0KDQpOb3cgdGhyb3VnaCB0aGlzIHBsb3QsIHdlIGNhbiBzZWUgd2hlcmUgdWZvIHNpZ2h0aW5ncyBoYXZlIGJlZW4gcmVjb3JkZWQuIFdlIHNoYWxsIHNlZSBtb3JlIGFib3V0IHBsb3Rpbmcgc3BhdGlhbCBwbG90cyBpbiBzb21lIG90aGVyIHBvc3QuDQoNCiMjIyBBbmFseXppbmcgc2hhcGUgY29sdW1uDQoNCkZpcnN0IGxldHMgc2VlIHdoYXQgdW5pcXVlIHNoYXBlcyB3ZSBoYXZlIGdvdC4gV2UgY2FuIHNlZSB0aGF0IGFuIGVtcHR5IGl0ZW0gaXMgcHJlc2VudC4gU28gd2UgcmVwbGFjZSBpdCB3aXRoIG5vdCBzcGVjaWZpZWQuDQoNCmBgYHtyfQ0KdW5pcXVlKHggPSB1Zm9fZGF0YSRzaGFwZSkNCmBgYA0KDQpgYGB7cn0NCnVmb19kYXRhJHNoYXBlW3Vmb19kYXRhJHNoYXBlID09ICIiXSA8LSAnTm90IHNwZWNpZmllZCcNCnNoYXBlX2RhdGEgPC0gZGF0YS5mcmFtZSggY291bnQoZGYgPSB1Zm9fZGF0YSwgdmFycyA9ICJzaGFwZSIpKQ0KZ2dwbG90KGRhdGEgPSBzaGFwZV9kYXRhLCBhZXMoeD1zaGFwZSwgeT1mcmVxKSkgKyANCiAgZ2d0aXRsZSgiTG9va2luZyBhdCBTaGFwZSIpICsNCiAgeGxhYigiU2hhcGUiKSArIA0KICB5bGFiKCJDb3VudCIpICsNCiAgZ2VvbV9iYXIoZmlsbD0ic3RlZWxibHVlIixzdGF0PSJpZGVudGl0eSIgKSArIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQ0KDQpgYGANCg0KU28gdGhyb3VnaCB0aGlzIHBsb3QsIHdlIGNhbiBzZWUgdGhhdCA8Yj4gdW5rb3duIDwvYj4gYW5kIDxiPiBub3Qgc3BlY2lmaWVkIDwvYj4gYWN0dWFsbHkgYWRkIHVwdG8gc2lnbmlmaWNhbnQgbnVtYmVyLiBJZiB3ZSB3ZXJlIHBlcmZvcm1pbmcgYW55IHJlZ3Jlc3Npb24gYW5hbHlzaXMsIHdlIHdvdWxkIHN1cmVseSBjbHViIHRoZXNlIHRvZ2V0aGVyIGludG8gc2luZ2xlIHZhcmlhYmxlLiBTaW1pbGFyeSAgPGI+IGNyZXNjZW50IDwvYj4sICA8Yj4gcHlyYW1pZCA8L2I+IGFuZCAgPGI+IHJvdW5kIDwvYj4gY291bGQgYmUgZGVhbHQgdGhpcyB3YXkgYXMgd2VsbC4NCg0KDQojIyMgQW5hbHl6aW5nIGNvdW50cnkgY29sdW1uDQoNCkxldHMgbG9vayBhdCB3aGF0IGNvdW50cmllcyB3ZSBnb3QgaW4gb3VyIGRhdGFzZXQuDQoNCmBgYHtyfQ0KdW5pcXVlKHVmb19kYXRhJGNvdW50cnkpDQoNCmBgYA0KDQpIbW1tLi4uIERvZXMgbm90IG1ha2Ugc2Vuc2UuIFNpbmNlIHdlIGRvbnQgd2FudCB0byB1c2Ugc2hvcnQgZm9ybXMgZm9yIGNvdW50cmllcywgbGV0cyBlbmNvZGUgdGhlbSB0byB3aGF0IHRoZXkgYWN0dWFsbHkgbWF5IGJlLg0KDQpgYGB7cn0NCnVmb19kYXRhJGV4dGVuZGVkQ291bnRyeVt1Zm9fZGF0YSRjb3VudHJ5ID09ICJ1cyJdIDwtICdVU0EnDQp1Zm9fZGF0YSRleHRlbmRlZENvdW50cnlbdWZvX2RhdGEkY291bnRyeSA9PSAiZ2IiXSA8LSAnVW5pdGVkIEtpbmdkb20nDQp1Zm9fZGF0YSRleHRlbmRlZENvdW50cnlbdWZvX2RhdGEkY291bnRyeSA9PSAiY2EiXSA8LSAnQ2FuYWRhJw0KdWZvX2RhdGEkZXh0ZW5kZWRDb3VudHJ5W3Vmb19kYXRhJGNvdW50cnkgPT0gImF1Il0gPC0gJ0F1c3RyYWxpYScNCnVmb19kYXRhJGV4dGVuZGVkQ291bnRyeVt1Zm9fZGF0YSRjb3VudHJ5ID09ICJkZSJdIDwtICdHZXJtYW55Jw0KdWZvX2RhdGEkZXh0ZW5kZWRDb3VudHJ5W3Vmb19kYXRhJGNvdW50cnkgPT0gIiJdIDwtICdVbmtub3duJw0KYGBgDQoNCk9uY2UgZG9uZSwgbGV0cyBsb29rIGF0IHRoZSBjb3VudHMgZm9yIGVhY2ggb2YgdGhlIGNvdW50cnkuDQoNCmBgYHtyfQ0KY291bnRyeV9jb3VudCA9IGNvdW50KGRmID0gdWZvX2RhdGEsIHZhcnMgPSAiZXh0ZW5kZWRDb3VudHJ5IikNCnByaW50KGNvdW50cnlfY291bnQpDQoNCmBgYA0KDQpObyBpZGVhLCB3aHkgVUZPcyBhcmUgbW9zdCBzaWdodGVkIGluIFVTQSAuLi4gQnV0IHNvIG1hbnkgdW5rbm93biBsb2NhdGlvbnMgYXJlIHByZXNlbnQuIFRoZSBudW1iZXIgaXMgaGlnaCBzbyBhbnkgc3RhdGlzdGljYWwgYW5hbHlzaXMgY2FudCBiZSBwZXJmb3JtZWQgd2l0aG91dCBpZ25vcmluZyBvciBjYXRlcmluZyBmb3IgdGhlc2UgbG9jYXRpb25zLg0KDQpTaW5jZSB3ZSBoYXZlIHNwYXRpYWwgZGF0YSB3ZSBjYW4gdmVyeSBlZmZlY3RpdmVseSBkaXNwbGF5IGl0IG9uIG1hcC4gQWx0aG91Z2ggdGhlcmUgYXJlIG1hbnkgb3RoZXIgd2F5cyB0byB2aXN1YWxpemUgdGhlIGluZm9ybWF0aW9uIHN1Y2ggYXMgcGllIGNoYXJ0cyBvciBkb251dCBjaGFydHMsIGJ1dCBkaXNwbGF5IG9uIG1hcCBpcyBwcm9iYWJseSB0aGUgbW9zdCBpbnRlcmFjdGl2ZSB3YXkuDQoNCmBgYHtyfQ0KcGllX2NoYXJ0X2RhdGEgPSBkYXRhLmZyYW1lKGdyb3VwID0gY291bnRyeV9jb3VudCRleHRlbmRlZENvdW50cnksIHZhbHVlID0gY291bnRyeV9jb3VudCRmcmVxKQ0KbWF0Y2hlZCA8LSBqb2luQ291bnRyeURhdGEyTWFwKHBpZV9jaGFydF9kYXRhLCBqb2luQ29kZT0iTkFNRSIsIG5hbWVKb2luQ29sdW1uPSJncm91cCIpDQptYXBDb3VudHJ5RGF0YShtYXRjaGVkLCBuYW1lQ29sdW1uVG9QbG90PSJ2YWx1ZSIsIG1hcFRpdGxlPSJVRk8gU2lnaHRpbmdzIGluIHRoZSBXb3JsZCIsIGNhdE1ldGhvZCA9ICJxdWFudGlsZXMiLCBjb2xvdXJQYWxldHRlID0gInRvcG8iLCBvY2VhbkNvbD0iYWxpY2VibHVlIikNCg0KYGBgDQoNCk5vdyBzdXBwb3NlIGlmIHdlIHdhbnRlZCB0byB6b29tIGludG8gbWFwIGZvciBzb21lIHBhcnRpY3VsYXIgcmVnaW9uIHdlIHdvdWxkIHVzZSB0aGUgZm9sbG93aW5nIGNvZGU6DQoNCmBgYHtyfQ0KbWFwQ291bnRyeURhdGEobWF0Y2hlZCwgbmFtZUNvbHVtblRvUGxvdD0idmFsdWUiLCBtYXBUaXRsZT0iVUZPIFNpZ2h0aW5ncyBpbiB0aGUgV29ybGQiLCBjYXRNZXRob2QgPSAicXVhbnRpbGVzIiwgY29sb3VyUGFsZXR0ZSA9ICJ0b3BvIiwgb2NlYW5Db2w9ImFsaWNlYmx1ZSIsIG1hcFJlZ2lvbiA9ICJBdXN0cmFsaWEiKQ0KYGBgDQoNCg0KIyMjIENvbmNsdXNpb24NCg0KSW4gdGhpcyBwb3N0IHdlIHNhdyBob3cgd2UgY2FuIGxvb2sgYXQgdGhlIGRhdGEgZm9yIHByZSBhbmFseXNpcyBhbmQgbW9kaWZ5IGl0IGFzIHBlciBvdXIgcmVxdWlyZW1lbnRzLiBXZSBhbHNvIHNhdyBob3cgd2UgY2FuIHBsb3QgZ3JhcGhzIGZvciBvbmx5IG9uZSB2YXJpYWJsZSBhbmQgcGVyZm9ybSBzaW1wbGUgYWdncmVnYXRpb25zLg0KDQo=